#include <bits/stdc++.h>
#define gc getchar
#define pc putchar
#define pt printf
#define For(i,a,b) for(int i=a;i<=b;++i)
#define Rof(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
const int Mxn=1505;
int N,M,V[Mxn];
double Ans;
char S[Mxn][Mxn],A[Mxn],T[Mxn],At[Mxn];
int _() {
	int x=0,f=0;char ch=gc();
	while(ch<'0'||ch>'9') f|=(ch=='-'),ch=gc();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=gc();
	return f?-x:x;
}
void __(int x) {
	int stk[30],tp=0;
	if(x<0) x=-x,pc('-');
	do stk[++tp]=x%10,x/=10;while(x);
	while(tp) pc(stk[tp--]^48);
}
double Sqrt(double x,int t) {
//	pt("Sqrt:%.3lf %d\n",x,t);
	double l=1,r=sqrt(x),Res=0;
	while(r-l>1e-6) {
		double d=(l+r)/2.0,s=1;
		For(i,1,t) s*=d;
		if(s<=x) l=d,Res=d;
		else r=d;
	}
	return Res;
}
void Calc() {
//	pt("%s\n",T+1);
	double Res=1;
	int Cnt=0;
	For(t,1,M) {
		int Ln=strlen(S[t]+1);
//		pt("Ln=%d\n",Ln);
		For(i,1,N-Ln+1) {
			int x=0,y=i;
			while(x<Ln&&S[t][x+1]==A[y]) x++,y++;//,pt("[%d %d]\n",x,y);
			if(x==Ln) ++Cnt,Res*=V[t];
		}
//		pt("#%d Cnt=%d\n",t,Cnt);
	}
//	pt("\n");
	if(Cnt>1) Res=Sqrt(Res,Cnt);
//	pt("[%s] ",A+1);
//	pt("%.4lf %.4lf %d\n",Ans,Res,Cnt);
	if(Res>Ans) {
		Ans=Res;
		For(i,1,N) At[i]=A[i];
	}
}
void DFS(int x) {
	if(x>N) {
		Calc();
		return ;
	}
	if(T[x]=='.') For(i,0,2) A[x]='0'+i,DFS(x+1);
	else A[x]=T[x],DFS(x+1);
}
void Task1() {
	DFS(1);
//	pt("%.4lf\n",Ans);
	pt("%s",At+1);
}
signed main() {
	freopen("magic.in","r",stdin);
	freopen("magic.out","w",stdout);
	N=_(),M=_(),scanf("%s",T+1);
	For(i,1,M) {
		scanf("%s",S[i]+1),V[i]=_();
	}
	Task1();//15+10(?)
	return 0;
}
